package com.ac;

import com.ac.interceptor.LoginInterceptor;
import io.swagger.annotations.Api;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
@EnableAsync
@EnableScheduling
@SpringBootApplication
@EnableSwagger2
@MapperScan("com.ac.api.*.dao") // 启用 Mapper 扫描
public class PeakfitApplication {

    public static void main(String[] args) {

        // 修复Windows短路径问题
       String tempDir = "./external-resources";
        System.setProperty("java.io.tmpdir", tempDir);
        SpringApplication.run(PeakfitApplication.class, args);
    }

    /**
     * 生成API文档的入口
     */
    @Bean
    public Docket generateApi() {
        // 配置自定义请求头（TOKEN）
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("token") // 请求头名称
                .description("安全令牌") // 描述
                .modelRef(new ModelRef("string")) // 数据类型
                .parameterType("header") // 参数类型
                .defaultValue(LoginInterceptor.SWAGGER_TOKEN) // 默认值
                .required(false) // 是否必填
                .build();

        // 配置全局 Authorization 请求头
        ParameterBuilder authPar = new ParameterBuilder();
        authPar.name("Authorization") // 请求头名称
                .description("") // 描述
                .modelRef(new ModelRef("string")) // 数据类型
                .parameterType("header") // 参数类型
                .required(false) // 是否必填
                .build();

        // 将两个请求头添加到全局配置中
        List<Parameter> pars = new ArrayList<>();
        pars.add(tokenPar.build());
        pars.add(authPar.build());

        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(this.apiInfo()) // API 文档信息
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) // 扫描带有 @Api 注解的类
                .paths(PathSelectors.any()) // 扫描所有路径
                .build()
                .globalOperationParameters(pars) // 添加全局请求头
                .pathMapping("/")
                .directModelSubstitute(LocalDate.class, String.class) // 替换 LocalDate 为 String
                .genericModelSubstitutes(ResponseEntity.class) // 替换 ResponseEntity
                .useDefaultResponseMessages(false); // 禁用默认响应消息
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("基本框架 API").build();
    }

}
